package com.example.demo.service.impl;

import com.example.demo.aop.Idempotents;
import com.example.demo.entity.CourseType;
import com.example.demo.entity.CourseTypeCondition;
import com.example.demo.exception.BusyException;
import com.example.demo.mapper.CourseMapper;
import com.example.demo.mapper.CourseTypeMapper;
import com.example.demo.service.CourseTypeService;
import com.example.demo.util.AssertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

@Service
public class CourseTypeServiceImpl implements CourseTypeService {

    @Autowired
    private CourseTypeMapper courseTypeMapper;

    @Autowired
    private CourseMapper courseMapper;

    @Override
    public List<CourseType> getAllCourseType() {
        return Optional.ofNullable(courseTypeMapper.selectAll()).orElse(Collections.emptyList());
    }

    @Override
    public List<CourseType> getCourseTypeByCondition(CourseTypeCondition condition) {
        if (Objects.isNull(condition)) {
            return Collections.emptyList();
        }
        return Optional.ofNullable(courseTypeMapper.selectByCondition(condition)).orElse(Collections.emptyList());
    }


    @Override
    public void addCourseType(CourseType courseType) {
        if (Objects.isNull(courseType)) {
            return;
        }
        batchCheckFieldNotNull(courseType.getTypeFlag(), courseType.getTypeName());
        courseTypeMapper.add(courseType);
    }

    private void batchCheckFieldNotNull(Object...values) {
        for (Object obj : values) {
            AssertUtil.notNull(obj, "有必填属性为空");
        }
    }

    @Override
    public void updateCourseType(CourseType courseType) {
        if (Objects.isNull(courseType)) {
            return;
        }
        batchCheckFieldNotNull(courseType.getId(), courseType.getTypeFlag(), courseType.getTypeName());
        CourseType courseTypeInDB = courseTypeMapper.selectById(courseType.getId());
        Boolean isHaveCourseUse = Optional.ofNullable(courseMapper.selectCourseByCourseType(courseType.getId())).orElse(false);
        if (isHaveCourseUse &&
           (!courseTypeInDB.getTypeFlag().equals(courseType.getTypeFlag()) ||
            !courseTypeInDB.getTypeName().equals(courseType.getTypeName()))) throw new BusyException("该课程类型已经有课程使用，无法删除");
        courseTypeMapper.update(courseType);
    }

    @Override
    public void deleteCourseType(Integer id) {
        if (Objects.isNull(id)) {
            return;
        }
        Boolean isHaveCourseUse = Optional.ofNullable(courseMapper.selectCourseByCourseType(id)).orElse(false);
        if (isHaveCourseUse) throw new BusyException("该课程类型已经有课程使用，无法删除");
        courseTypeMapper.delete(id);
    }
}
